package com.kinghood.productcenter.service.product;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.kinghood.infrastructure.model.dto.StatusRemarkReqDTO;
import com.kinghood.productcenter.common.model.dto.product.*;
import com.kinghood.productcenter.common.model.dao.product.ProductBaseDO;
import com.kinghood.productcenter.common.model.dto.base.ListProductQueryDTO;
import com.kinghood.productcenter.common.model.dto.restcloud.GetProductInfoReqDTO;
import com.kinghood.productcenter.common.model.dto.sku.GetSkuRelateIdDTO;
import com.kinghood.productcenter.common.model.vo.base.AttributeNameVO;
import com.kinghood.productcenter.common.model.vo.product.ProductListVO;
import com.kinghood.productcenter.common.model.vo.product.ProductConfigVO;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * <p>
 * 商品款式基础表 服务类
 * </p>
 *
 * @author KingHood
 * @since 2023-12-20
 */
public interface IProductBaseService extends IService<ProductBaseDO> {

    /**
     * 产品列表
     *
     * @param param 参数
     * @author jp
     * @date 2023/12/25
     */
    Page<ProductListVO> listProduct(ListProductQueryDTO param);

    /**
     * 保存商品
     *
     * @param in 入参
     * @return 商品id
     * @author zfj
     * @date 2023/12/25
     */
    Long addProduct(ProductReqDTO in);

    /**
     * 修改商品
     *
     * @param in 入参
     * @return 商品id
     * @author zfj
     * @date 2023/12/25
     */
    Long updateProduct(ProductReqDTO in);

    /**
     * 商品详情
     *
     * @param id 商品id
     * @return 商品信息
     * @author zfj
     * @date 2023/12/25
     */
    ProductDTO getProduct(Long id);

    /**
     * 导入文件
     *
     * @param list excel数据
     * @param headCodeMap 字段映射
     * @param dao 基础数据
     * @param rowFieldRecord
     * @return excel数据
     * @author zfj
     * @date 2023/12/25
     */
    List<Map<Integer, String>> handleExcelData(List<Map<Integer, String>> list,
                                               Map<Integer, ProductExcelAttributeDTO> headCodeMap,
                                               BaseProductDaoDTO dao, RowFieldRecordDTO rowFieldRecord);

    /**
     * 获取商品选项的基础数据
     *
     * @author zfj
     * @date 2023/12/28
     */
    BaseProductDaoDTO getBaseProductDao();

    /**
     * 获取列表中存在的code
     *
     * @param productCodeList 产品代码列表
     * @author jp
     * @date 2023/12/28
     */
    List<String> getCodeByList(Set<String> productCodeList);

    /**
     * 新增时的配置信息
     *
     * @param param 参数
     * @author jp
     * @date 2023/12/28
     */
    ProductConfigVO getConfigInfo(ProductAddTypeDTO param);

    /**
     * 删除
     *
     * @param id id
     * @author jp
     * @date 2023/12/29
     */
    void delProduct(Long id);

    /**
     * 更新产品状态
     *
     * @param param 参数
     * @author jp
     * @date 2023/12/29
     */
    void updateProductStatus(StatusRemarkReqDTO param);

    /**
     * 添加标签
     *
     * @param param 参数
     * @author jp
     * @date 2024/01/03
     */
    void addLabel(ProductLabelReqDTO param);

    /**
     * 导入数据解析
     *
     * @param cachedDataList excel数据
	 * @param headCodeMap 头
     * @param dao 基础数据
     * @return 导入数据
     * @author zfj
     * @date 2024/1/4
     */
    List<Map<String, String>> handleImportData(List<Map<Integer, String>> cachedDataList,
                                               Map<Integer, ProductExcelAttributeDTO> headCodeMap, BaseProductDaoDTO dao);

    /**
     * 获取产品标签
     *
     * @param param 参数
     * @return @return {@link Object }
     * @author jp
     * @date 2024/01/11 17:26
     */
    Object getProductLabel(ProductLabelListReqDTO param);

    void delProductLabel(Long id);

    void updateProductLabelTime(ProductLabelReqDTO param);

    /**
     * 获取产品属性
     *
     * @return @return {@link Object }
     * @author jp
     * @date 2024/01/15 15:53
     */
    List<AttributeNameVO> getProductFields(String businessCode);

    /**
     * 获取产品搜索字段
     *
     * @return @return {@link Object }
     * @author jp
     * @date 2024/01/17 19:05
     */
    List<AttributeNameVO> getProductSearchFields(String businessCode);

    /**
     * 获取sku相关的id
     *
     * @param productId 商品id
	 * @param skuCode sku编码
     * @return sku相关id
     * @author zfj
     * @date 2024/1/24
     */
    GetSkuRelateIdDTO getSkuRelateId(Long productId, String skuCode);

    /**
     * 根据同步条件获取到款式信息
     *
     * @param in 同步条件
     * @return 款式信息
     * @author zfj
     * @date 2024/2/2
     */
    List<BaseProductDTODO> getProductInfo(GetProductInfoReqDTO in);
}
